mojo 提供了兩種function定義的形式,讓使用者可以自由使用,一方面兼容python的語法,另一方面則借鑑Rust的規則
def 的行為就類似於 python的def
使用def時, 不用在宣告變數時標註型別
考慮以下程式,在名稱前後加上Hi驚嘆號。
def foo(word):
word = "Hi, " + word
result = word + "!"
return result
def main():
hello = foo("Hundo")
print(hello)
其中name跟result都被解析成 object型別
但其實也可以標註型別,標註起來就會像原本的python在進行type-annotation時一樣,只是對於函式內的變數要加上var
def foo(word: String) -> String:
word = "Hi, " + word
var result: String = word + "!"
return result
def main():
hello = foo("Hundo")
print(hello)
word 跟 回傳都被標註成String了!
現在考慮另一個function bar,將def 換成fn,對於調用方來說他們沒什麼差別,就是fn定義的函式變得更加嚴格了
fn bar(word: String) -> String:
word = "Hi, " + word
var result: String = word + "!"
return result
會發現word不可以被改變, 這是因為fn的不可變特性, 確保了傳入的變數不會被意外改動
有幾種解法,其中一種是不要改動原本的變數
fn bar(word: String) -> String:
var result: String = "Hi, " + word + "!"
return result
另外一種則是加上mut關鍵字, 讓word可變
def main():
var name: String = "Hundo"
hello = bar(name)
print(hello)
print(name)
fn bar(mut word: String = "John") -> String:
word = "Hi, " + word
var result: String = word + "!"
return result
這樣就是函式的基本概念了,其實只要稍微注意
特性 | def | fn |
---|---|---|
型別 | 可選標註 | 必需標註 |
可變性 | 可變 | 不可變 |
Mojo中的函式還有其他功能跟特性,後續的文章會再提到